home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / PickMeUp.sit / Pick Me Up / source code / Movie app source / pickmeUp97 / source / CMoviePane.cp < prev    next >
Text File  |  1997-06-27  |  16KB  |  698 lines

  1. // ===========================================================================
  2. //    CMoviePane.cp               ©1996-1997 Wootech Corporation. All rights reserved.
  3. // ===========================================================================
  4. /*
  5.     Insert Comments Here.
  6.  
  7. */
  8. /*
  9.       *    $Workfile: MyTextEdit.cp $
  10.     *    $Modtime: 6/20/97 6:18 PM $
  11.     *    $Revision: 2 $
  12.     *    $Date: 6/20/97 6:18 PM $
  13.     *    $History: MyTextEdit.cp $
  14. */
  15. #include "CMoviePane.h"
  16. #include "MoreFilesExtras.h"
  17. #include <Movies.h>
  18. #include "CTempEventDispatcher.h"
  19. #include "CMovieWind.h"
  20.  
  21. // ===========================================================================
  22. //    ••  CMoviePane
  23. // ===========================================================================
  24.  
  25. CMoviePane::CMoviePane(LStream*        inStream) : LView(inStream)
  26. {
  27.     //Debugger();
  28.     ::EnterMovies();
  29.     mMoviePtr = nil;
  30.     FSSpec        theSpec = GetMovieFileSpec();
  31.     mMoviePtr = GetMovieFromFile(theSpec);
  32.     
  33.     mPlayIt = false;
  34.     
  35.  
  36. }
  37.  
  38.  
  39. // ===========================================================================
  40. //    ••  ~CMoviePane
  41. // ===========================================================================
  42.  
  43. CMoviePane::~CMoviePane()
  44. {
  45.     if(mMoviePtr)
  46.     {
  47.         ::DisposeMovie(mMoviePtr);
  48.     }
  49.  
  50. }
  51.  
  52.  
  53. // ===========================================================================
  54. //    ••  GetMovieFileSpec
  55. // ===========================================================================
  56. FSSpec        
  57. CMoviePane::GetMovieFileSpec()
  58. {
  59.     //  algorithm.
  60.     
  61.     /*
  62.         Check for the movie file folder in default directory.
  63.         If not there throw error.
  64.         Get FSSpec of the directory.
  65.         Use dir spec to get the dir id of the directory.
  66.         Use that to get the FSSpec of the file named "Pick Me Up Movie"
  67.         OSErr = noErr else throw.
  68.         return theMovieSpec;
  69.     */
  70.     
  71.     FSSpec        spec;
  72.     OSErr        myErr;
  73.     long        dirID;
  74.     Boolean        isDir;
  75.     
  76.     myErr = ::FSMakeFSSpec(0,0, "\pMovie Folder", &spec);
  77.     ThrowIfOSErr_(myErr);
  78.     myErr = ::FSpGetDirectoryID(&spec, &dirID, &isDir);
  79.     ThrowIfOSErr_(myErr);
  80.     myErr = ::FSMakeFSSpec(0, dirID, "\pPick Me Up Movie", &spec);
  81.     ThrowIfOSErr_(myErr);
  82.     
  83.     return spec;
  84.     
  85.     
  86.     
  87. }
  88.  
  89.  
  90. // ===========================================================================
  91. //    ••  GetMovieFromFile
  92. // ===========================================================================
  93. Movie        
  94. CMoviePane::GetMovieFromFile(FSSpec  inSpec)
  95. {
  96.     /*
  97.         Open movie file.
  98.         Take inSpec and pass to QuickTime routine to get a Movie from
  99.         a file.
  100.         
  101.         return theMovie;
  102.     
  103.     */
  104.     
  105.     Movie        theMovie;
  106.     short        resRefNum;
  107.     OSErr        myErr;
  108.     short        movResID;
  109.     Boolean        changed;
  110.     
  111.     myErr = ::OpenMovieFile( &inSpec, &resRefNum, fsRdPerm );
  112.     ThrowIfOSErr_(myErr);
  113.     
  114.     myErr = NewMovieFromFile(    &theMovie, 
  115.                                 resRefNum, 
  116.                                 &movResID, nil, newMovieActive, &changed);
  117.     //Debugger();                            
  118.     ThrowIfOSErr_(myErr);
  119.     
  120.     myErr = ::CloseMovieFile(resRefNum);
  121.     //ThrowIfOSErr_(myErr);
  122.     return theMovie;
  123.  
  124. }
  125.  
  126.  
  127. // ===========================================================================
  128. //    ••  DrawSelf
  129. // ===========================================================================
  130. void    
  131. CMoviePane::DrawSelf()
  132. {
  133.     if(mMoviePtr)
  134.     {
  135.         //::ShowMoviePoster(mMoviePtr);
  136.         Rect    thisRect;
  137.         ::GetMovieBox(mMoviePtr, &thisRect);
  138.         short width, height;
  139.         width = thisRect.right - thisRect.left;
  140.         height = thisRect.bottom - thisRect.top;
  141.         thisRect.left = 2;
  142.         thisRect.top = 0;
  143.         thisRect.bottom = height;
  144.         thisRect.right = width;
  145.         
  146.         ::DrawPicture(::GetMoviePosterPict(mMoviePtr), &thisRect);
  147.     }else DebugStr("\pmMoviePtr is nil.");
  148. }
  149.  
  150.  
  151. // ===========================================================================
  152. //    ••  PlayMovie
  153. // ===========================================================================
  154. void        
  155. CMoviePane::PlayMovie()
  156. {
  157.     /* simple play function for QuickTime */
  158.     /* might be better to redefine this as an LPeriodical SpendTime() or something */
  159.     //Debugger();
  160.     //Rect frame;
  161.     //CalcLocalFrameRect(frame);
  162.     
  163.     //  Test code to see if the movies rect has changed since this object was in
  164.     //  stanciated.
  165.     Rect    movieRect;
  166.     ::GetMovieBox(mMoviePtr, &movieRect);
  167.     Assert_(::EqualRect(&mRectBuff, &movieRect));
  168.     //::OffsetRect(&movieRect, -8, -8);
  169.     //::SetMovieBox(mMoviePtr, &movieRect);
  170.     //mRectBuff = movieRect;
  171.     
  172.     
  173.     //FocusDraw();
  174.     CTempEventDispatcher  theEvent;
  175.     //Rect        theRect;
  176.     //Rect        drawRect = {0,0,0,0};
  177.     
  178.     //::GetMovieBox(mMoviePtr, &theRect);
  179.     //::SetRect(&drawRect, (frame.left +(frame.right - 5)), (theRect.bottom/2),
  180.                         //    theRect.right, ((theRect.bottom/2) + 5));
  181.     mPlayIt = true;
  182.     ::GoToBeginningOfMovie(mMoviePtr);
  183.     ::MoviesTask(mMoviePtr, 0);
  184.     ::StartMovie(mMoviePtr);
  185.     
  186.     
  187.     //RGBColor        red = {65353, 0,0};
  188.     //RGBForeColor(&red);
  189.     Boolean  donePlaying = ::IsMovieDone(mMoviePtr);
  190.     Boolean     firstTime = true;
  191.     while( !donePlaying )
  192.     {
  193.         ::MoviesTask(mMoviePtr, 0); /* keep playing until finished */
  194.         //::PaintRect(&drawRect);
  195.         //::OffsetRect(&drawRect, -5, 0);
  196.         if(!firstTime)
  197.         {
  198.             theEvent.ProcessTempEvent();
  199.             
  200.             
  201.         }else{
  202.                 ::FlushEvents(-1, 0);
  203.                 firstTime = false;
  204.             }
  205.         
  206.         if(mPlayIt)
  207.         {
  208.             donePlaying = ::IsMovieDone(mMoviePtr);
  209.         }else{
  210.                 donePlaying = true;
  211.             }
  212.     }
  213.     this->Refresh();
  214. }
  215.  
  216.  
  217. // ===========================================================================
  218. //    ••  GetMovieFromHandle
  219. // ===========================================================================
  220. Movie        
  221. CMoviePane::GetMovieFromHandle(Handle inHandle)
  222. {
  223.     
  224.  
  225. }
  226.  
  227.  
  228. // ===========================================================================
  229. //    ••  GetMovieData
  230. // ===========================================================================
  231. Handle        
  232. CMoviePane::GetMovieData(FSSpec  inSpec)
  233. {
  234.  
  235.  
  236. }
  237.  
  238.  
  239. // ===========================================================================
  240. //    ••  ListenToMessage
  241. // ===========================================================================
  242. void        
  243. CMoviePane::ListenToMessage(MessageT  inMessage, void*  ioParam)
  244. {
  245.     if(inMessage == kStopPlaying)
  246.         mPlayIt = false;
  247.  
  248. }
  249.  
  250.  
  251. // ===========================================================================
  252. //    ••  ScaleOrCenterMovie
  253. // ==========================================================================
  254.  
  255. void        
  256. CMoviePane::ScaleAndCenterMovie()
  257. {
  258.     Movie inMoviePtr = mMoviePtr;
  259.     Rect    theRect, thisFrame, outDrawRect;
  260.     CalcLocalFrameRect(thisFrame);
  261.     ::GetMovieBox(inMoviePtr, &theRect);
  262.     
  263.     short     movieWidth, movieHeight,
  264.             thisWidth, thisHeight;
  265.     
  266.     //  Getting height and width of the movie rect.
  267.     movieWidth = theRect.right - theRect.left;
  268.     Assert_((movieWidth > 0));
  269.     movieHeight = theRect.bottom - theRect.left;
  270.     Assert_((movieHeight > 0));
  271.     
  272.     
  273.     //  Getting the height and width of this' rect.
  274.     thisWidth = thisFrame.right - thisFrame.left;
  275.     Assert_((thisWidth > 0));
  276.     thisHeight = thisFrame.bottom - thisFrame.left;
  277.     Assert_((thisHeight > 0));
  278.     
  279.     //  Checking which is bigger.
  280.     if((movieWidth > thisWidth) || (movieHeight > thisHeight))
  281.     {
  282.         ScaleDrawRect(theRect, thisFrame, &outDrawRect);
  283.     }
  284.     else{
  285.             outDrawRect = theRect;
  286.         }
  287.         
  288.     LocalToPortPoint(topLeft(outDrawRect));
  289.     LocalToPortPoint(botRight(outDrawRect));
  290.     ::SetMovieBox(inMoviePtr, &outDrawRect);
  291.     mRectBuff = outDrawRect;
  292.     
  293. }
  294.  
  295.  
  296. //===========================================================================
  297. // ••  ScaleDrawRect
  298. //===========================================================================
  299. void                        
  300. CMoviePane::ScaleDrawRect(    Rect  inOriginalRect, Rect  inThumnailRect,
  301.                                                 Rect*  outScaledRect)
  302. {
  303.     /*
  304.         NOTES:
  305.         This routine is for scaling the drawRect of a picture to fit into
  306.         a thumbnail sized drawing area.  For example, if you have a picture
  307.         that is 500 x 700 pixels, but only have a 70 x 70 pixel size
  308.         area in which to draw the image, this routine will scale
  309.         the picture down.
  310.         
  311.         This routine will also scale a rect(outScaledRect) so that it will center
  312.         itself in the thumnail.  This way, the picture that is scaled down will
  313.         be centered when it is drawn in the thumbnail.
  314.         
  315.         Why only Rects?
  316.         Generally when drawing pictures, the system routines that do the actual 
  317.         drawing want a Rect to define the size and location of the picture in the
  318.         current GrafPort.  that is why all that is needed here is to scale the 
  319.         rect and then pass outScaledRect to the draw routine.
  320.         
  321.         Rect    inOriginalRect;      Input the original size of the picture's rect here.
  322.         Rect    inThumbnailRect;    Input the size of the thumnail where the picture is
  323.                                     supposed to be drawn here.
  324.         Rect*    outScaledRect;        This is where the scaled rect for the picture
  325.                                     will be passed back to you.
  326.                                     
  327.     
  328.     
  329.     */
  330.     short    percent = 0;
  331.     ::InsetRect(&inThumnailRect, 1,1);
  332.     
  333.     //  Getting the h and w of the orig pics frame size.
  334.     short w = inOriginalRect.right - inOriginalRect.left;
  335.     short h = inOriginalRect.bottom - inOriginalRect.top;
  336.             
  337.     //  Getting the h and w of the thumbs frame size.
  338.     short Aw = inThumnailRect.right - inThumnailRect.left;
  339.     short Ah = inThumnailRect.bottom - inThumnailRect.top;
  340.             
  341.     //  Comparing which is bigger with the orig pics
  342.     //  Why do we have to compare?  In order to scale the picture, we
  343.     //  need to know which side is bigger.  That way, depending on 
  344.     //  which one is bigger, the bigger side will be the full size
  345.     //  of the thumbnail window, and then we'll scale the other
  346.     //  side down to match the other side.
  347.     if(w > h)
  348.     {
  349.         //  Since the width is larger than the height, we are here.
  350.                 
  351.         //  We first set the left of inOriginalRect to inThumbnailRects left, 
  352.         //  plus some offset.  inThumnailRect was inset by 1, and the offset
  353.         //  is just found by experimenting.
  354.         inOriginalRect.left = inThumnailRect.left + 1;
  355.                 
  356.         //  Since the width is bigger than the height, we set the 
  357.         //  width to be the size of inThumnailRects width.  That way the
  358.         //  entire width will fit into the thumbnail rect.
  359.         inOriginalRect.right = Aw;
  360.                 
  361.         //  Now we need to know what percentage the image was scaled down. 
  362.         //  We need to know this because we need to scale the other side
  363.         //  just as much as we scaled the the width.
  364.         percent = ((Aw * 100)/w);
  365.                 
  366.         //  Now we take the percent and determine a pixel amount based on the
  367.         //  percentage we scaled.
  368.         inOriginalRect.bottom = ((percent * h)/100);
  369.                 
  370.         //  Now we need to center the newly scaled rect in the thumbnail
  371.         //  rect.  If we didn't do this, then the upper left corner of the
  372.         //  image would be at the upper left corner of the thumbnail.  We want
  373.         //  the image to be in the middle of the thumbnail so we kluge here.
  374.         //inOriginalRect.top = ((Ah - inOriginalRect.bottom)/2);
  375.                 
  376.         //  Just some fudging to get the centering just right.  This is found
  377.         //  with experimentation.
  378.         //inOriginalRect.top += 1;
  379.                 
  380.         //  Since we just collapsed the rect, top down, we need to expand the 
  381.         //  bottom of the rect as much as we collapsed it from top.
  382.         //inOriginalRect.bottom += inOriginalRect.top;
  383.                 
  384.                 
  385.     }else if(w < h)
  386.         {
  387.                     
  388.             inOriginalRect.top = inThumnailRect.top + 1;
  389.             inOriginalRect.bottom = Ah;
  390.             percent = ((Ah * 100)/h);
  391.                     
  392.             inOriginalRect.right = ((percent * w)/100);
  393.             //inOriginalRect.left = ((Aw - inOriginalRect.right)/2);
  394.             //inOriginalRect.left += 2;
  395.             //inOriginalRect.right += inOriginalRect.left;
  396.         }else if(w == h)
  397.             {
  398.                 InsetRect(&inThumnailRect, 1,1);
  399.                 inOriginalRect = inThumnailRect;
  400.                     
  401.             }
  402.             
  403.         //  Now passing the scaled rect back into outScaledRect
  404.         ::BlockMoveData(&inOriginalRect, outScaledRect, sizeof(Rect));
  405.         return;
  406.  
  407.  
  408.  
  409.  
  410. }
  411.  
  412. /*
  413. // ===========================================================================
  414. //    ••  
  415. // ===========================================================================
  416.  
  417. CMoviePane::
  418. {
  419.  
  420.  
  421. }
  422.  
  423.  
  424. // ===========================================================================
  425. //    ••  
  426. // ===========================================================================
  427.  
  428. CMoviePane::
  429. {
  430.  
  431.  
  432. }
  433.  
  434.  
  435. // ===========================================================================
  436. //    ••  
  437. // ===========================================================================
  438.  
  439. CMoviePane::
  440. {
  441.  
  442.  
  443. }
  444.  
  445.  
  446. // ===========================================================================
  447. //    ••  
  448. // ===========================================================================
  449.  
  450. CMoviePane::
  451. {
  452.  
  453.  
  454. }
  455.  
  456.  
  457. // ===========================================================================
  458. //    ••  
  459. // ===========================================================================
  460.  
  461. CMoviePane::
  462. {
  463.  
  464.  
  465. }
  466.  
  467.  
  468. // ===========================================================================
  469. //    ••  
  470. // ===========================================================================
  471.  
  472. CMoviePane::
  473. {
  474.  
  475.  
  476. }
  477.  
  478.  
  479. // ===========================================================================
  480. //    ••  
  481. // ===========================================================================
  482.  
  483. CMoviePane::
  484. {
  485.  
  486.  
  487. }
  488.  
  489.  
  490. // ===========================================================================
  491. //    ••  
  492. // ===========================================================================
  493.  
  494. CMoviePane::
  495. {
  496.  
  497.  
  498. }
  499.  
  500.  
  501. // ===========================================================================
  502. //    ••  
  503. // ===========================================================================
  504.  
  505. CMoviePane::
  506. {
  507.  
  508.  
  509. }
  510.  
  511.  
  512. // ===========================================================================
  513. //    ••  
  514. // ===========================================================================
  515.  
  516. CMoviePane::
  517. {
  518.  
  519.  
  520. }
  521.  
  522.  
  523. // ===========================================================================
  524. //    ••  
  525. // ===========================================================================
  526.  
  527. CMoviePane::
  528. {
  529.  
  530.  
  531. }
  532.  
  533.  
  534. // ===========================================================================
  535. //    ••  
  536. // ===========================================================================
  537.  
  538. CMoviePane::
  539. {
  540.  
  541.  
  542. }
  543.  
  544.  
  545. // ===========================================================================
  546. //    ••  
  547. // ===========================================================================
  548.  
  549. CMoviePane::
  550. {
  551.  
  552.  
  553. }
  554.  
  555.  
  556. // ===========================================================================
  557. //    ••  
  558. // ===========================================================================
  559.  
  560. CMoviePane::
  561. {
  562.  
  563.  
  564. }
  565.  
  566.  
  567. // ===========================================================================
  568. //    ••  
  569. // ===========================================================================
  570.  
  571. CMoviePane::
  572. {
  573.  
  574.  
  575. }
  576.  
  577.  
  578. // ===========================================================================
  579. //    ••  
  580. // ===========================================================================
  581.  
  582. CMoviePane::
  583. {
  584.  
  585.  
  586. }
  587.  
  588.  
  589. // ===========================================================================
  590. //    ••  
  591. // ===========================================================================
  592.  
  593. CMoviePane::
  594. {
  595.  
  596.  
  597. }
  598.  
  599.  
  600. // ===========================================================================
  601. //    ••  
  602. // ===========================================================================
  603.  
  604. CMoviePane::
  605. {
  606.  
  607.  
  608. }
  609.  
  610.  
  611. // ===========================================================================
  612. //    ••  
  613. // ===========================================================================
  614.  
  615. CMoviePane::
  616. {
  617.  
  618.  
  619. }
  620.  
  621.  
  622. // ===========================================================================
  623. //    ••  
  624. // ===========================================================================
  625.  
  626. CMoviePane::
  627. {
  628.  
  629.  
  630. }
  631.  
  632.  
  633. // ===========================================================================
  634. //    ••  
  635. // ===========================================================================
  636.  
  637. CMoviePane::
  638. {
  639.  
  640.  
  641. }
  642.  
  643.  
  644. // ===========================================================================
  645. //    ••  
  646. // ===========================================================================
  647.  
  648. CMoviePane::
  649. {
  650.  
  651.  
  652. }
  653.  
  654.  
  655. // ===========================================================================
  656. //    ••  
  657. // ===========================================================================
  658.  
  659. CMoviePane::
  660. {
  661.  
  662.  
  663. }
  664.  
  665.  
  666. // ===========================================================================
  667. //    ••  
  668. // ===========================================================================
  669.  
  670. CMoviePane::
  671. {
  672.  
  673.  
  674. }
  675.  
  676.  
  677. // ===========================================================================
  678. //    ••  
  679. // ===========================================================================
  680.  
  681. CMoviePane::
  682. {
  683.  
  684.  
  685. }
  686.  
  687.  
  688. // ===========================================================================
  689. //    ••  
  690. // ===========================================================================
  691.  
  692. CMoviePane::
  693. {
  694.  
  695.  
  696. }
  697.  
  698. */